﻿using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using DbTaglio.SvcLayer;
using DbTaglio.SvcLayer.DbTaglioService;
using System.Web.Caching;

namespace Gucci.DbTaglio.Site.Wp.RicercaDich_dbtWp
{
    [ToolboxItem(false)]
    public partial class RicercaDich_dbtWp : System.Web.UI.WebControls.WebParts.WebPart
    {
        MetGet _proxy = null;
        string _idargs = "", _codfornitore = "", _descrizione = "", _codice = "", _codMateriale = "", _spUserName = "";
        DBTWinLogin _loginUserData = null;
        SPUser _spUser = null;
        bool _isAbilitatoAlConsumo = false, _isAdmin = false;

        CacheManager<DichiarazioneSearchModel> _cacheMan = null;

        # region LOGIN - DATI UTENTE

        DBTManager _manager = null;
        private string getSPuser()
        {
            _spUser = SPContext.Current.Web.CurrentUser;

            var arr = _spUser.Name.Split(new[] { "\\" }, StringSplitOptions.RemoveEmptyEntries);
            if (arr != null && arr.Length > 1)
                _spUserName = arr[1];

            return _spUserName;
        }

        #endregion



        public CacheManager<DichiarazioneSearchModel> TheCacheManager
        { 
             get{
                 if (_cacheMan == null)
                    _cacheMan = getCache();
                 return _cacheMan;                 
                }             
          }


        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            InitializeControl();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            _manager = new DBTManager(getSPuser());
            var result = _manager.EnsureLogin(HiddenCodiceFornitore.Value, HiddenIsAdmin.Value);

            if (result.HaErrori)
            {
                LabelErrori.Text = result.Eccezione.Message;
                return;
            }

            impostaLayout();
        }

        private CacheManager<DichiarazioneSearchModel> getCache()
        {
            string key =  SPContext.Current.Web.CurrentUser.ID.ToString();
            return new CacheManager<DichiarazioneSearchModel>(key, 5);
        }

        private void impostaLayout()
        {
            if(!Page.IsPostBack)
                LoadDecodifiche();


            txt_DataDal.Attributes.Add("onkeypress", "javascript:return allowOnlyData(event);");
            txt_DataAl.Attributes.Add("onkeypress", "javascript:return allowOnlyData(event);");
                
                //.Attributes.Add("onkeypress", "javascript:return allowOnlyNumbers(event);");
        }


        private void LoadDecodifiche()
        {

            //Fornitore
            var result = _manager.ProxyGetWcf.getTerzisti(true);
            _manager.setDropDown<Terzista[]>(result, drop_Fornitore, "RagioneSocialeTerzista", "CodiceTerzista", LabelErrori);

            //Codice materiale
            var materiali = _manager.ProxyGetWcf.getMasterItems(new ItemSearchModel(), true);
            _manager.setDropDown<MasterItem[]>(materiali, drop_CodMat, "ItemDisplayName", "ItemId", LabelErrori);
            

            //Colore


            //Stagione
            var stagioni = _manager.ProxyGetWcf.getStagioni(true);
            _manager.setDropDown<Stagione[]>(stagioni, drop_Stagione, "StagioneId", "StagioneId", LabelErrori);
   

            //Conceria
            var concerie = _manager.ProxyGetWcf.getConcerie(new ConceriaSearchModel() { CodiceFornitore = _codfornitore });
            _manager.setDropDown<Conceria[]>(concerie, drop_Conceria, "CodiceConceria", "DescrizioneConceria", LabelErrori);


            //Commessa
            var filter = new CommessaSearchModel() { CodiceTerzista = _codfornitore };
            var commesse = _manager.ProxyGetWcf.getCommesse(filter, true);
            _manager.setDropDown<Commessa[]>(commesse, drop_Commessa, "TestataCommessa", "", LabelErrori);


   

        }



        protected void Azioni_Click(object sender, ImageClickEventArgs e)
        {
            var btn = (ImageButton)sender;
            var azione = btn.CommandName;
            //_IDargs = btn.CommandArgument; //id
            
            switch (azione)
            {
                case "Ret":
                    setInVediRes(false);
                    break;
                case "Reset":
                    resetFilter();
                    break;
                case "Find":
                    getFilter();
                    break;
                default:
                    break;
            }
        }

        private void resetFilter()
        {
            txt_DataDal.Text = string.Empty; 
            txt_DataAl.Text = string.Empty;

            resetComboToDefaultValue(drop_Fornitore, "-1");
        }

        private void resetComboToDefaultValue(DropDownList pDrop, string pValue)
        {
            string valore = "";
            valore = pDrop.SelectedValue;
            if(!string.IsNullOrEmpty(valore))
                pDrop.Items.FindByValue(valore).Selected = false ;

            var item = pDrop.Items.FindByValue(pValue);
            
            if(item != null)
                item.Selected = true;
        }

        private void getFilter()
        {
            DichiarazioneSearchModel filter = new DichiarazioneSearchModel();

            bool IsInItalianFormat = true;
            Dichiarazione dichiarazione = new Dichiarazione();
            var validator = new global::DbTaglio.SvcLayer.DichiarazioniValidator(dichiarazione);


            //Validazione iniziale sui valori per le textbox
            //Non serve validare i tipi per le drop perché già OK
            //Verranno validate poi per assicurare la presenza di valore adotto o meno!

            if (validator.ValidateDate(txt_DataDal.Text))
                filter.DataDal = validator.GetDateFromString(txt_DataDal.Text, IsInItalianFormat);

            if (validator.ValidateDate(txt_DataAl.Text))
                filter.DataAl = validator.GetDateFromString(txt_DataAl.Text, IsInItalianFormat);


            if (validator.CanConvertTo<string>(drop_Fornitore.SelectedValue))
                dichiarazione.CodiceFornitore = validator.Convert<string>(drop_Fornitore.SelectedValue);

            //Macchina
            if (validator.CanConvertTo<string>(drop_TipoMacchina.SelectedValue))
                dichiarazione.CodiceMacchina = validator.Convert<string>(drop_TipoMacchina.SelectedValue);

            //MAteriale
            if (validator.CanConvertTo<string>(drop_CodMat .SelectedValue))
                dichiarazione.CodiceCausale = validator.Convert<string>(drop_CodMat.SelectedValue);



            saveInCache(filter);            
             showDati();
            
        }

        private void saveInCache(DichiarazioneSearchModel pFilter)
        {
            TheCacheManager.Clear();
            TheCacheManager.Insert(pFilter, CacheItemPriority.Default);
        }



        private RetData<object> getDati()
        {
            var filter = TheCacheManager.GetDati();

            if (filter == null) 
                return new RetData<object> (new Exception("Errore : Filtro non trovato"));
            
            var getter = new MetGet(null, null, true);

            //TODO : getDichiarazioni
            //var result = getter.getDichiarazioni(true);
            //if (result.HaErrori)
            //{
            //    LabelErrori.Text = result.Eccezione.Message;
            //}

            return new RetData<object>(new object ()); 
        }

        private void setInVediRes(bool pMod)
        {
            MultiView1.SetActiveView(pMod ? View2 : View1);
        }


        private void showDati()
        {
            var result = getDati();

            if (result.HaErrori)
            {
                LabelErrori.Text = result.Eccezione.Message;
            }
            else
            {
                ListView1.DataSource = result.Dati;
                ListView1.DataBind();
            }
        }



        protected void DataPagerProducts_PreRender(object sender, EventArgs e)
        {
           
        }

        protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
        {
            DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
            showDati();
        }

        protected void ListView1_SelectedIndexChanged(object sender, EventArgs e)
        {


        }

        protected void drop_Fornitore_SelectedIndexChanged(object sender, EventArgs e)
        {
            //carico il tipo macchina e gli operatori 
            LoadTipoMacchina();
            LoadOperatore();
        }



        private void LoadColoriMateriale(string pCodice)
        {
            //Colore materiale
            var result = _manager.ProxyGetWcf.getColoriComponente(pCodice);
            _manager.setDropDown<Colore[]>(result, drop_Colore, "DescrizioneColore", "CodiceColore", LabelErrori, true);
        }


        private void LoadTipoMacchina()
        {
            //Tipo Macchina
            var result = _manager.ProxyGetWcf.getMacchine(new DBTGenFiter() { CodiceForn = _manager.CodFornitore });
            _manager.setDropDown<Macchina[]>(result, drop_TipoMacchina, "CodiceMacchina", "CodiceMacchina", LabelErrori, true);
        }

        private void LoadOperatore()
        {

            var result = _manager.ProxyGetWcf.getOperatori(new DBTGenFiter() { CodiceForn = _manager.CodFornitore });
            _manager.setDropDown<Operatore[]>(result, drop_Operatore, "NomeOperatore", "CodiceOperatore", LabelErrori, true);
           
        }




    }
}
